# -*- coding: utf-8 -*-

import os, sys
import traceback
sys.path.append(os.path.join(os.path.dirname(__file__), '../'))
import commonlib
import html2dict as html2text
import datetime, time
import re
import pprint
from MongoModel import MongoModel
from lxml import etree


MONGO_SERVER = 'beta.mana.vn'
MONGO_PORT = 27017
PREFIX = '/uploads/lichphim/'
DOWNLOAD_PATH = '/home/hoangnamhai/HarvestedData/lichphim/'

logger = commonlib.getMongoLog(MONGO_SERVER, MONGO_PORT, 'chieuphimquocgia')

class LichPhim(MongoModel):
    
    def __init__(self, host, port):
        MongoModel.__init__(self, host, port)
    
    def getListFilm(self):
        print 'start getListFilm'
        url = 'http://chieuphimquocgia.com.vn/Home/'
        data = []
        try:
            tree = commonlib.getXMLTree(url)
            if tree == None: return data
            for item in tree.xpath("//select[@name='ctl00$Left1$drphim']/option"):
                fid = commonlib.getAttribText(item, "value")
                fname = commonlib.getElementText(item)
                if fid=='0': continue
                data.append([fid, fname])
        except:
            logger.warning("{0}:{1}".format(sys.exc_info()[0], sys.exc_info()[1]))
        return data
    
    def standardizeTimeStr2(self, timeStr):
        year = datetime.datetime.now().year
        m = re.search(r"(\d+)/(\d+)", timeStr)
        if m:
            return datetime.datetime(year, int(m.group(2)), int(m.group(1)))
        else:
            raise Exception, 'Lỗi chuyển đổi thời gian: ({0})'.format(sys.exc_info()[1])
    
    def standardizeTimeStr(self, timeStr):
        m = re.search(r"Ngày (\d+) Tháng (\d+) Năm (\d+)", timeStr)
        if m:
            return datetime.datetime(int(m.group(3)), int(m.group(2)), int(m.group(1)))
        else: 
            raise Exception, 'Lỗi chuyển đổi thời gian từ chuỗi sang kiểu datetime'
    
    def getFilmDetail(self, fid):
        url = 'http://chieuphimquocgia.com.vn/film/Filmdetail.aspx?ID={0}'.format(fid)
        karr = {'duration': 'Thời lượng', 'director': 'Đạo diễn', 'actor': 'Diễn viên', 'country': 'Nước sản xuất', 'category': 'Thể loại'}
        data = {}
        try:
            db = self.connection['lichchieuphim']
            collection = db['phim']
            data['hash'] = commonlib.getMD5Hash("cpqg_{0}".format(fid))
            film = collection.find_one({'hash': data['hash']}, {'_id': 1})
            if film: return str(film['_id'])
            tree = commonlib.getXMLTree(url)
            if tree == None: return
            contentNode = tree.xpath("//td[@width='162px' and @align='left']/following-sibling::*[1]")
            if (len(contentNode)>0):
                thumbnail = commonlib.urlJoin(url, commonlib.getAttribText(contentNode[0].xpath(".//img[1]"), 'src'))
                titleNode = contentNode[0].xpath(".//strong[contains(., 'Thời lượng')]/../../preceding-sibling::*[1]/td".decode('utf-8'))
                data['title'] = commonlib.stringify(titleNode)
                for k,v in karr.items():
                    data[k] = commonlib.stringify(contentNode[0].xpath(".//*[contains(., '{0}')]/../following-sibling::*[1]".format(v).decode('utf-8')))
                data['description'] = commonlib.stringify(contentNode[0].xpath(".//span[contains(@id, 'lblcomment')]"))
                detailNode = contentNode[0].xpath(".//span[contains(@id, 'lbldetail')]/..")
                details = html2text.html2text(etree.tounicode(detailNode[0]), url)
                for i in range(len(details)):
                    item = details[i]
                    if item['type'] == 'image':
                        del item['hash']
                        item['data'] = commonlib.downloadNUpload(ssh, item['data'], DOWNLOAD_PATH, PREFIX)
                        if item['data'] == '': del details[i]
                data['detail'] = details
                collection.save(data)
                film = collection.find_one({'hash': data['hash']}, {'_id': 1})
                return str(film['_id'])
        except:
            logger.warning("{0}:{1}".format(sys.exc_info()[0], sys.exc_info()[1]))
#            traceback.print_exc()
        return;

    def normalizeName(self, str):
        str = str.replace(' -', '')
        str = str.replace('2D', '')
        str = str.replace('3D', '')
        str = re.sub(r"\(.*\)", '', str)
        return commonlib.normalizeStr(str)
    
    def addPhim(self, data, input, sDate, listfilm):
        try:
            m = re.search(r'(\d+h\d*): (.+)', input)
            if not m: return;
            giochieu = m.group(1).strip()
            tenphim = m.group(2).strip().replace(' -', '')
            if not data.has_key(tenphim):
                data[tenphim] = {'title': tenphim, 'schedule': {}}
            schedule = data[tenphim]['schedule']
            match = False
            tenphimNormalize = self.normalizeName(tenphim)
            for f in listfilm:
                fname = self.normalizeName(f[1])
                if fname == tenphimNormalize:
                    match = True
                    film_id = self.getFilmDetail(f[0])
                    data[tenphim]['film_id'] = film_id
                    break 
            if not match: data[tenphim]['film_id'] = ''
            if not schedule.has_key(sDate):
                schedule[sDate] = [giochieu]
            else:
                schedule[sDate].append(giochieu)
        except:
            raise Exception, sys.exc_info()[1]
    
    def getLichChieu(self):
        print 'start getLichChieu'
        url = 'http://chieuphimquocgia.com.vn/lichphim/Default.aspx?MenuId=14'
        try:
            listfilm = self.getListFilm()
            db = self.connection['lichchieuphim']
            lichphim_collection = db['lichphim']
            phim_collection = db['phim']
            tree = commonlib.getXMLTree(url)
            data = {}
            if tree == None: return;
            for item in tree.xpath("//div/table[@id='ctl00_mstpagelichchieu_GridView1']/tr[position()>1]"):
                sDate = self.standardizeTimeStr2(commonlib.stringify(item.xpath("./td/table/tr[1]/td[1]")))
                moc = []
                for irow in item.xpath(".//table[contains(@id, 'ctl00_mstpagelichchieu_GridView1')]//td[1]"):
                    moc.append(commonlib.stringify(irow))
                rows = item.xpath(".//table[contains(@id, 'ctl00_mstpagelichchieu_GridView1')]/tr")
                if rows == None: print 'Không lấy được lịch chiếu phim'; return;
                for i in range(len(rows)):
                    for irow in rows[i].xpath(".//td[position()>1]"):
                        rowContent = commonlib.stringify(irow)
                        if rowContent == '' or rowContent == '.': continue
                        if not re.search(r'\d+h\d+', rowContent): rowContent = "{0}: {1}".format(moc[i], rowContent)
                        self.addPhim(data, rowContent, sDate.strftime("%d/%m/%Y"), listfilm)
            for item in data.values():
                sc = item['schedule']
                sorted(sc.iterkeys())
            pprint.pprint(data.values())
            lichphim_collection.save({'_id': 'chieuphimquocgia',
                  'lastupdate': datetime.datetime.now(),
                  'timestamp': time.time(),
                  'data': data.values(),
                  'cinema': 'Trung tâm chiếu phim quốc gia',
                  'city': 'Hà Nội'})   
        except:
            logger.warning("{0}:{1}".format(sys.exc_info()[0], sys.exc_info()[1]))
    
if __name__ == '__main__':
    import argparse
    lastaction = time.time()
    # -- Phần argument command line
    parser = argparse.ArgumentParser(description="Crawler tin tức")
    parser.add_argument('--run', action='store', dest='run_mode',
                    help='sftp: chạy dưới local và upload file lên server thông qua sftp', metavar='sftp')
    args = parser.parse_args()
    # -----------------------------
    # -- Phần khởi tạo kết nối ssh tới server mana.vn
    run_mode = args.run_mode
    ssh = None
    if run_mode == 'sftp':
        ssh = commonlib.getSSH('mana.vn', 'giangnh')
        if ssh == None:
            print 'Không kết nối được tới server, thoát crawler'
            os._exit(1)
    cr = LichPhim(MONGO_SERVER, MONGO_PORT)
    cr.getLichChieu()
    if ssh is not None: ssh.close()
    print 'finished at {0}'.format(datetime.datetime.now())
    os._exit(1)
    
